import {
	baseUrl
} from './env'

export default async(url='', data={}, type='GET', method='fetch') => {
	type = type.toUpperCase();
	url = baseUrl + url;
	if(type == 'GET'){
		let dataStr = ''		 // 数据拼接字符串
		// 遍历data 键值对用&连接
		Object.keys(data).forEach(key => {
			dataStr += key + '=' + data[key] + '&'
		})
		if(dataStr !== ''){
			// 截取出每一对键值对
			dataStr = dataStr.substr(0, dataStr.lastIndexOf('&'));
			url = url + '?' + dataStr;
		}
	}
	if(window.fetch && method == 'fetch'){
		let requestConfig = {
			// Fetch跨域的时候默认不会带cookie 需要手动的指定 
			credentials: 'include',
			method: type,
			headers: {				// 请求的头信息
				'Accept': 'application/json',
				'Content-Type': 'application/json'
			},
			mode: "cors",			// 允许跨域
			// 表示fetch请求不顾一切的依赖缓存, 即使缓存过期了,
			// 它依然从缓存中读取. 除非没有任何缓存, 那么它将发送一个正常的request.
			cache: "force-cache"
		}
		if(type == 'POST'){
			// 在对象上定义一个新属性，或修改一个已经存在的属性，并返回这个对象。
			// requestConfig[定义属性的对象] body[属性名]  value[该属性对应的值]
			Object.defineProperty(requestConfig, 'body',{
				value: JSON.stringify(data)
			})
		}
		try {
			//async 用于声明一个异步函数, 该函数需返回一个 Promise 对象. 而await通常后
			//接一个 Promise对象, 需等待该 Promise 对象的 resolve() 方法执行并且返回值后才能继续执行
			const response = await fetch(url, requestConfig);
			const responseJson = await response.json();
			return responseJson;
		}catch(error){
			throw new Error(error);
		}
	}
	// 不能兼容 fetch 使用 XMLHttpRequest()
	else {
		return new Promise((resolve, reject) => {
			let requestObj;
			// 没有的话就新建一个 XMLHttpRequest对象
			if(window.XMLHttpRequest){
				requestObj = new XMLHttpRequest();
			}else{
				requestObj = new ActiveXObject;
			}
			let sendData = '';
			if(type == 'POST'){
				sendData = JSON.stringify(data);
			}
			requestObj.open(type, url, true);
			requestObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			requestObj.send(sendData);
			requestObj.onreadystatechange = () => {
				if(requestObj.readyState == 4){
					if(requestObj.status == 200){
						let obj = requestObj.response;
						if(typeof obj !== 'object'){
							obj = JSON.parse(obj);
						}
						resolve(obj);
					}else{
						reject(requestObj)
					}
				}
			}
		})
	}
}


